package runtimeData

import "JVM/Jvmgo/GoToJVM/runtimeData/heap"

/*
	对于一般的java虚拟机来说，线程的运行时区域应该包括：1.虚拟机栈 2.本地方法栈 3.程序计数器(PC寄存器)
	但是在HotSpot中，将 1，2 合并了，本程序以HotSpot为模板，所以会创建两个属性。
*/

type Thread struct {
	pc    int
	stack *Stack
}

// 构造器
func NewThread() *Thread {
	return &Thread{
		stack: newStack(1024),
	}
}

// getter
func (self *Thread) PC() int {
	return self.pc
}
func (self *Thread) SetPC(pc int) {
	self.pc = pc
}

func (self *Thread) PushFrame(frame *Frame) {
	self.stack.push(frame)
}
func (self *Thread) PopFrame() *Frame {
	frame := self.stack.pop()
	frame.Free()
	return frame
}

// 返回栈顶帧，即当前帧
func (self *Thread) CurrentFrame() *Frame {
	return self.stack.top()
}
func (self *Thread) TopFrame() *Frame {
	return self.stack.top()
}
func (self *Thread) NewFrame(method *heap.Method) *Frame {
	return newFrame(self, method)
}
func (self *Thread) IsStackEmpty() bool {
	return self.stack.isEmpty()
}
func (self *Stack) isEmpty() bool {
	return self._top == nil
}
